gboolean was_grabbed)
{
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
- int i;
+ GList *l;
- if (!priv->controllers)
- return;
if (was_grabbed)
return;
- for (i = (int)priv->controllers->len - 1; i >= 0; i--)
+ for (l = g_list_last (priv->event_controllers); l; l = l->prev)
{
- GtkEventController *controller = g_ptr_array_index (priv->controllers, i);
+ GtkEventController *controller = l->data;
gtk_event_controller_reset (controller);
}
gtk_widget_real_root (GtkWidget *widget)
{
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
- guint i;
+ GList *l;
gtk_widget_forall (widget, (GtkCallback) gtk_widget_root, NULL);
- if (!priv->controllers)
- return;
-
- for (i = 0; i < priv->controllers->len; i++)
+ for (l = priv->event_controllers; l; l = l->next)
{
- GtkEventController *controller = g_ptr_array_index (priv->controllers, i);
-
- if (GTK_IS_SHORTCUT_CONTROLLER (controller))
- gtk_shortcut_controller_root (GTK_SHORTCUT_CONTROLLER (controller));
+ if (GTK_IS_SHORTCUT_CONTROLLER (l->data))
+ gtk_shortcut_controller_root (GTK_SHORTCUT_CONTROLLER (l->data));
}
}
gtk_widget_real_unroot (GtkWidget *widget)
{
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
- guint i;
+ GList *l;
- if (priv->controllers)
+ for (l = priv->event_controllers; l; l = l->next)
{
- for (i = 0; i < priv->controllers->len; i++)
- {
- GtkEventController *controller = g_ptr_array_index (priv->controllers, i);
-
- if (GTK_IS_SHORTCUT_CONTROLLER (controller))
- gtk_shortcut_controller_unroot (GTK_SHORTCUT_CONTROLLER (controller));
- }
+ if (GTK_IS_SHORTCUT_CONTROLLER (l->data))
+ gtk_shortcut_controller_unroot (GTK_SHORTCUT_CONTROLLER (l->data));
}
gtk_widget_forall (widget, (GtkCallback) gtk_widget_unroot, NULL);
GtkWidget **target)
{
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+ GtkEventController *controller;
GdkEvent *event;
- guint i;
-
- if (!priv->controllers)
- goto out;
+ GList *l;
- for (i = 0; i < priv->controllers->len; i++)
+ for (l = priv->event_controllers; l; l = l->next)
{
- GtkEventController *controller = g_ptr_array_index (priv->controllers, i);
+ controller = l->data;
if (!GTK_IS_GESTURE (controller))
continue;
}
}
-out:
*target = NULL;
return NULL;
}
gdk_touch_event_get_emulating_pointer (last_event))
return TRUE;
}
- else if (priv->controllers)
+ else
{
- guint i;
+ GList *l;
+
/* For a NULL(pointer) sequence, find the pointer emulating one */
- for (i = 0; i < priv->controllers->len; i++)
+ for (l = priv->event_controllers; l; l = l->next)
{
- GtkEventController *controller = g_ptr_array_index (priv->controllers, i);
+ GtkEventController *controller = l->data;
if (!GTK_IS_GESTURE (controller))
continue;
{
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
gboolean sequence_press_handled = FALSE;
- guint i;
-
- if (!priv->controllers)
- return FALSE;
+ GList *l;
/* Check whether there is any remaining gesture in
* the capture phase that handled the press event
*/
- for (i = 0; i < priv->controllers->len; i++)
+ for (l = priv->event_controllers; l; l = l->next)
{
- GtkEventController *controller = g_ptr_array_index (priv->controllers, i);
+ GtkEventController *controller = l->data;
GtkPropagationPhase phase;
GtkGesture *gesture;
gboolean emulates_pointer, sequence_handled = FALSE;
GdkEvent *mimic_event;
GtkWidget *target;
- GList *group = NULL;
+ GList *group = NULL, *l;
GdkEventSequence *seq;
int n_handled = 0;
- guint i;
- if (state != GTK_EVENT_SEQUENCE_CLAIMED &&
- (!priv->controllers || priv->controllers->len == 0))
+ if (!priv->event_controllers && state != GTK_EVENT_SEQUENCE_CLAIMED)
return TRUE;
if (emitter)
emulates_pointer = _gtk_widget_get_emulating_sequence (widget, sequence, &seq);
mimic_event = _gtk_widget_get_last_event (widget, seq, &target);
- for (i = 0; i < priv->controllers->len; i++)
+ for (l = priv->event_controllers; l; l = l->next)
{
- GtkEventController *controller = g_ptr_array_index (priv->controllers, i);
+ GtkEventController *controller;
GtkEventSequenceState gesture_state;
GtkGesture *gesture;
gboolean retval;
seq = sequence;
+ controller = l->data;
gesture_state = state;
if (!GTK_IS_GESTURE (controller))
gboolean emulates_pointer;
gboolean handled = FALSE;
GdkEventSequence *seq;
- guint i;
-
- if (!priv->controllers)
- return FALSE;
+ GList *l;
emulates_pointer = _gtk_widget_get_emulating_sequence (widget, sequence, &seq);
- for (i = 0; i < priv->controllers->len; i++)
+ for (l = priv->event_controllers; l; l = l->next)
{
- GtkEventController *controller = g_ptr_array_index (priv->controllers, i);
+ GtkEventController *controller;
GtkGesture *gesture;
seq = sequence;
+ controller = l->data;
if (!GTK_IS_GESTURE (controller))
continue;
GtkWidget *target,
double x,
double y,
- GtkPropagationPhase phase)
+ GtkPropagationPhase phase)
{
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+ GtkEventController *controller;
gboolean handled = FALSE;
- guint i;
-
- if (!priv->controllers)
- return FALSE;
+ GList *l;
g_object_ref (widget);
- for (i = 0; i < priv->controllers->len; i++)
+ l = priv->event_controllers;
+ while (l != NULL)
{
- GtkEventController *controller = g_ptr_array_index (priv->controllers, i);
+ GList *next = l->next;
if (!WIDGET_REALIZED_FOR_EVENT (widget, event))
break;
+ controller = l->data;
+
if (controller == NULL)
{
- g_ptr_array_remove_index (priv->controllers, i);
- i--; /* Need to check this index again */
+ priv->event_controllers = g_list_delete_link (priv->event_controllers, l);
}
else
{
break;
}
}
+
+ l = next;
}
g_object_unref (widget);
double y)
{
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
- guint i;
-
- if (!priv->controllers)
- return;
+ GList *l;
g_object_ref (widget);
- for (i = 0; i < priv->controllers->len; i++)
+ for (l = priv->event_controllers; l; l = l->next)
{
- GtkEventController *controller = g_ptr_array_index (priv->controllers, i);
+ GtkEventController *controller = l->data;
gtk_event_controller_handle_crossing (controller, crossing, x, y);
}
**/
void
gtk_widget_set_sensitive (GtkWidget *widget,
- gboolean sensitive)
+ gboolean sensitive)
{
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
- guint i;
+ GList *l;
g_return_if_fail (GTK_IS_WIDGET (widget));
priv->sensitive = sensitive;
- if (priv->controllers)
+ for (l = priv->event_controllers; l; l = l->next)
{
- for (i = 0; i < priv->controllers->len; i++)
- {
- GtkEventController *controller = g_ptr_array_index (priv->controllers, i);
+ GtkEventController *controller = l->data;
- gtk_event_controller_reset (controller);
- }
+ gtk_event_controller_reset (controller);
}
gtk_accessible_update_state (GTK_ACCESSIBLE (widget),
destroy_surface_transform_data (widget);
}
-static void
-gtk_widget_unset_controller (GtkWidget *widget,
- GtkEventController *controller)
-{
- GTK_EVENT_CONTROLLER_GET_CLASS (controller)->unset_widget (controller);
- g_object_unref (controller);
-}
-
static void
gtk_widget_finalize (GObject *object)
{
GtkWidget *widget = GTK_WIDGET (object);
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+ GList *l;
gtk_grab_remove (widget);
_gtk_size_request_cache_free (&priv->requests);
- if (priv->controllers)
+ l = priv->event_controllers;
+ while (l)
{
- guint i;
- for (i = 0; i < priv->controllers->len; i++)
- {
- GtkEventController *controller = g_ptr_array_index (priv->controllers, i);
+ GList *next = l->next;
+ GtkEventController *controller = l->data;
- gtk_widget_unset_controller (widget, controller);
- }
- g_ptr_array_free (priv->controllers, TRUE);
+ if (controller)
+ gtk_widget_remove_controller (widget, controller);
+
+ l = next;
}
+ g_assert (priv->event_controllers == NULL);
if (_gtk_widget_get_first_child (widget) != NULL)
{
GTK_EVENT_CONTROLLER_GET_CLASS (controller)->set_widget (controller, widget);
- if (G_UNLIKELY (!priv->controllers))
- priv->controllers = g_ptr_array_new ();
-
- g_ptr_array_add (priv->controllers, controller);
+ priv->event_controllers = g_list_prepend (priv->event_controllers, controller);
if (priv->controller_observer)
- gtk_list_list_model_item_added_at (priv->controller_observer, priv->controllers->len - 1);
+ gtk_list_list_model_item_added_at (priv->controller_observer, 0);
}
/**
GtkEventController *controller)
{
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+ GList *before, *list;
g_return_if_fail (GTK_IS_WIDGET (widget));
g_return_if_fail (GTK_IS_EVENT_CONTROLLER (controller));
g_return_if_fail (gtk_event_controller_get_widget (controller) == widget);
- if (priv->controller_observer)
- {
- /* Here we care about the index */
- guint index;
-
- g_ptr_array_find (priv->controllers, controller, &index);
+ GTK_EVENT_CONTROLLER_GET_CLASS (controller)->unset_widget (controller);
- gtk_list_list_model_item_removed_at (priv->controller_observer, index);
- g_ptr_array_remove_index_fast (priv->controllers, index);
- }
- else
- {
- /* XXX _fast really possible? */
- g_ptr_array_remove_fast (priv->controllers, controller);
- }
+ list = g_list_find (priv->event_controllers, controller);
+ before = list->prev;
+ priv->event_controllers = g_list_delete_link (priv->event_controllers, list);
+ g_object_unref (controller);
- gtk_widget_unset_controller (widget, controller);
+ if (priv->controller_observer)
+ gtk_list_list_model_item_removed (priv->controller_observer, before);
}
gboolean
while (widget != NULL && widget != parent)
{
- guint i;
+ GList *l;
- if (!priv->controllers)
- goto next;
-
- for (i = 0; i < priv->controllers->len; i++)
+ for (l = priv->event_controllers; l; l = l->next)
{
- GtkEventController *controller = g_ptr_array_index (priv->controllers, i);
+ GtkEventController *controller = l->data;
if (controller == NULL ||
!GTK_IS_GESTURE (controller))
return TRUE;
}
-next:
widget = priv->parent;
priv = gtk_widget_get_instance_private (widget);
}
gtk_widget_reset_controllers (GtkWidget *widget)
{
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
- guint i;
-
- if (!priv->controllers)
- return;
+ GList *l;
/* Reset all controllers */
- for (i = 0; i < priv->controllers->len; i++)
+ for (l = priv->event_controllers; l; l = l->next)
{
- GtkEventController *controller = g_ptr_array_index (priv->controllers, i);
+ GtkEventController *controller = l->data;
if (controller == NULL)
continue;
{
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
GPtrArray *controllers = g_ptr_array_new ();
- guint i;
+ GList *l;
g_assert (out_n_controllers);
- for (i = 0; i < priv->controllers->len; i++)
+ for (l = priv->event_controllers; l; l = l->next)
{
- GtkEventController *controller = g_ptr_array_index (priv->controllers, i);
+ GtkEventController *controller = l->data;
if (gtk_event_controller_get_propagation_phase (controller) == phase)
g_ptr_array_add (controllers, controller);
static gpointer
gtk_widget_controller_list_get_first (gpointer widget)
{
- GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
-
- if (priv->controllers)
- return g_ptr_array_index (priv->controllers, 0);
-
- return NULL;
+ return GTK_WIDGET (widget)->priv->event_controllers;
}
static gpointer
gtk_widget_controller_list_get_next (gpointer item,
gpointer widget)
{
- GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
- guint index;
-
- g_ptr_array_find (priv->controllers, item, &index);
-
- if (index + 1 <= priv->controllers->len - 1)
- return g_ptr_array_index (priv->controllers, index + 1);
-
- return NULL;
+ return g_list_next (item);
}
static gpointer
gtk_widget_controller_list_get_prev (gpointer item,
gpointer widget)
{
- GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
- guint index;
-
- g_ptr_array_find (priv->controllers, item, &index);
-
- if (index >= 0)
- return g_ptr_array_index (priv->controllers, index - 1);
+ return g_list_previous (item);
+}
- return NULL;
+static gpointer
+gtk_widget_controller_list_get_item (gpointer item,
+ gpointer widget)
+{
+ return g_object_ref (((GList *) item)->data);
}
/**
gtk_widget_controller_list_get_next,
gtk_widget_controller_list_get_prev,
NULL,
- (gpointer) g_object_ref,
+ gtk_widget_controller_list_get_item,
widget,
gtk_widget_controller_observer_destroyed);